index signature
object型を定義する際の[key: string]の記法
code:ts
type A = {
key: string: number
}
型安全でない ref
stringであれば何でも許容してしまう
更に悪いことに、返り値はnumber|undefinedではなく、全てnumberになる
ref 任意のindex signatureではなく、Mapを使う
[key: T]のTの部分に使える型は以下の4つのみ
string
Template Literal Types
number
symbol
例
code:ts
type A = {
key: string: unknown;
[key: hoge${string}]: unknown;
key: number: unknown;
key: symbol: unknown;
};
リテラル型は使えない
code:ts
type A = {
key: 42: unknown; // NG
key: 'hoge': unknown; // NG
};
これはindex signature使わずに{ 42: .., hoge: ..}で定義すれば良いだけなので、特に困ることはないmrsekut.icon
型変数は使えない
T extends stringの型制約があったとしても型変数は使えない
リテラル型も含んでしまうからか?
code:ts
type A<K extends string> = {
key: K: unknown; // NG
};
判定
RemoveIndexSignature<R>
Hoge[number]のようにしてアクセスできる
code:ts
type Tuple = {
x: number: 'a' | 'b' | 'c' | 'd';
};
type A = Tuplenumber; // 'a' | 'b' | 'c' | 'd'
indexの部分:とinの違いってなんだっけ #??
[x: stringと[x in string]の違い
inはMapped Types
https://twitter.com/keigoi/status/1347911245035229187
https://qiita.com/uhyo/items/e2fdef2d3236b9bfe74a#インデックスシグネチャ
https://susisu.hatenablog.com/entry/2021/11/13/222730